iT邦幫忙

2024 iThome 鐵人賽

DAY 15
0
生成式 AI

2024 年用 LangGraph 從零開始實現 Agentic AI System系列 第 15

【Day 15】- Agentic Design Pattern: Planning - 賦予 AI 自主規劃能力

  • 分享至 

  • xImage
  •  

摘要
這篇文章主要介紹了 Agentic Design Pattern 中的 Planning 模式,它賦予 AI 自主規劃的能力,讓 AI 能夠處理那些難以預先定義固定步驟的複雜任務。文章分為兩個主要部分:第一部分介紹了 Planning 模式的運作原理,以及如何使用技術實現它。第二部分介紹了 Plan-and-Solve 論文,它提出了一種新的提示方法,讓大型語言模型能夠明確地為解決給定問題制定計劃,並生成中間推理過程。文章詳細說明了 Plan-and-Solve 提示的步驟和效果,以及如何使用 LangChain 和 LangGraph 來實現它。
總體而言,這篇文章探討了 Planning 模式在賦予 AI 自主規劃能力方面的作用,以及 Plan-and-Solve 論文在促進這種能力發展方面的貢獻。它旨在為讀者提供對 Planning 模式的深入理解,並展示其在實際應用中的潛力。

1. Planning 模式:AI 自主規劃的關鍵

Planning 模式的核心在於賦予 AI 自主規劃能力。想像一下,當我們要求 AI 代理進行某個主題的在線研究時,它能夠自動將這個大任務分解為多個小步驟:研究特定子主題、綜合發現、最後編寫報告。這種能力使 AI 能夠處理那些難以預先定義固定步驟的複雜任務。

img

關鍵亮點:Planning 使 AI 能夠處理那些難以預先定義固定步驟的複雜任務。

1.1 Planning 的運作機制

首先,AI會理解並分析給定的任務。就像我們讀題一樣,AI需要先搞清楚「題目」在問什麼。接著,它會從自己的「知識庫」——也就是訓練數據中檢索相關的信息。這就像我們回憶過去學過的知識一樣。

  • 理解任務後,AI會將大任務分解為多個小的、可管理的子任務。這個過程很像我們解決數學題時的思路:先把複雜的問題拆解成幾個小問題。

  • 對每個子任務,AI都會生成具體的執行步驟。同時,AI還會考慮每個步驟所需的資源,就像我們在做實驗前會準備好所有需要的器材一樣。

  • 在執行過程中,AI還會不斷監控和調整。如果某個步驟出了問題,它會及時改變策略。這種靈活性是Planning的一大優勢。

最後,AI會將所有子任務的結果整合起來,生成最終的輸出。這就像我們完成一篇論文,最後要把所有章節組合成一個完整的作品。

1.2 技術實現的步驟

Planning 模式的實現通常涉及以下步驟:

  1. 任務分析:LLM 理解並分解複雜任務
  2. 計劃生成:創建結構化的步驟序列
  3. 工具調用:執行每個步驟,可能涉及多個 AI 模型或外部工具

上mermaid 流程圖

這邊採用 HuggingGPT 例子介紹

上HuggingGPT 圖

為了精簡說明,內容大幅度簡化 HuggingGPT 運作細節,對這一 part 感興趣的朋友,可以前往 HuggingGPT 論文查看,圖片與過程取自原文 Response 中。(https://arxiv.org/abs/2303.17580)

假設請 Agent 將一張男孩的照片轉換為相同姿勢的女孩圖片,可能會被分解為:

  1. 使用姿態檢測工具分析原圖
  2. 使用圖像生成工具基於檢測到的姿態創建新圖片

LLM 可能會輸出類似這樣的結構化字符串來指定計劃:

{tool: pose-detection, input: image.jpg, output: temp1}
{tool: pose-to-image, input: temp1, output: final.jpg}

此結構化輸出指定了要執行的兩個步驟,然後觸發軟體呼叫姿勢偵測工具,然後呼叫姿勢到影像工具來完成任務。 (此範例僅用於說明目的;HuggingGPT 使用不同的格式。)

1.3 Planning 的現況與挑戰

Planning 模式的主要優勢在於其靈活性和自主性,能夠處理複雜且難以預先定義的任務。然而,這種自主性也帶來了一定的不可預測性。相比於其他較為成熟的模式(如 Reflection 和 Tool Use),Planning 技術仍在發展階段,其行為有時難以準確預料。

2. Plan-and-Solve:Planning Agent 的經典範例

想像你有一個AI助手,它能回答問題,但總是一步一步地摸索。有時候它會迷失方向,或者忘記之前的步驟。這就是傳統的"Action Agents"(如ReAct框架)的工作方式。Plan-and-Solve就像給AI裝上了一個超級大腦。它不再是盲目地一步步摸索,而是先制定一個全面的計劃,然後有條不紊地執行。

2.1 Plan-and-Solve 論文的研究目標

傳統的「Action Agents」框架,即所謂的ReAct模式,正逐漸讓位於更為先進的系統。這種演進是因應日益複雜的用戶需求而生,也反映了開發者對AI代理的依賴程度不斷提升。

ReAct框架的運作機制可以簡化為一個循環過程:首先,接收用戶輸入;其次,AI代理根據情境選擇合適的工具及其參數;接著,調用選定的工具並記錄結果;然後,將這些資訊回饋給代理以決定下一步行動。這個過程會不斷重複,直到AI認為無需再使用工具,便直接回應用戶。

然而,隨著技術的進步,這種方法的局限性逐漸顯現。為了應對更為複雜的任務,「Plan-and-Execute Agent」應運而生。這種新型代理將規劃與執行階段分離,實現了更為精準和可靠的操作模式。

2.2 創新解決方案:PS 提示法

論文提出了PS提示(Plan-and-Solve prompting),這是一種新的零樣本思維鏈(zero-shot Chain-of-Thought, CoT)提示方法。它使大型語言模型(Large Language Models, LLMs)能夠明確地為解決給定問題制定計劃,並在預測輸入問題的最終答案之前生成中間推理過程。與先前的少樣本CoT方法不同,後者在提示中包含了逐步的少量示範(Few-shot)例子,而零樣本PS提示方法不需要示範例子,其提示僅涵蓋問題本身和一個簡單的觸發句。類似於零樣本CoT,零樣本PS提示包含兩個步驟。在第一步中,提示首先使用提議的提示模板進行推理,以生成問題的推理過程和答案。在第二步中,它使用答案提取提示來提取答案以進行評估,例如「因此,答案(阿拉伯數字)是」。

原文描述不懂的話,讓我們接著往下看內容

2.3 深入剖析 Plan-and-Solve 的運作流程

2.3.1 步驟ㄧ、Prompting for Reasoning Generation

PS提示由兩個部分組成:首先制定計劃,將整個任務分割為較小的子任務,然後根據計劃執行子任務。

上原始論文 Figure2

可以看到 (a) 為 zero-shot CoT 執行結果。零樣本 CoT 鼓勵LLMs用「Let’s think step by step」[1]來產生多步驟推理,當問題複雜時,仍然可能產生錯誤的推理步驟。

與零樣本 CoT 不同,(b) Ps Prompting 首先詢問LLMs透過制定逐步計劃並執行該計劃來找到答案,從而製定解決問題的計劃。使用 Prompt 為「Let's first understand the problem and devise a plan to solve the problem. Then, let's carry out the plan to solve the problem step by step.」[2][1]論文 Prompt ID 編號 101; [2]論文 Prompt ID 編號 102。查看原始專案Github連結:https://github.com/AGI-Edgerunners/Plan-and-Solve-Prompting

2.3.2 步驟二、Prompting for Answer Extraction

為了進一步提高生成推理步驟的質量,PS提示中添加了更詳細的說明。

上原始論文 Figure3

具體來說,增加了「提取相關變數及其對應數字」和「計算中間結果(注意計算和常識)」的指令。這種新的提示變體被稱為“PS+提示”策略。

2.4 實驗成果與效能評估

這項研究探討了不同方法在常識推理數據集上的表現,主要聚焦於 CommonsenseQA 和 StrategyQA 兩個數據集。研究結果如下:

  1. 研究方法:

    • 採用改進的零樣本 PS+(Program of Thought+)提示策略。
    • 排除了零樣本 PoT(Program of Thought)方法,因其不適用於此類問題。
    • 將結果與少樣本 CoT(Chain of Thought,手動提示)和零樣本 CoT 進行對比。
  2. 主要發現:

    • PS+ 提示策略在 CommonsenseQA 數據集上的準確率為 71.9%,優於零樣本 CoT 的 65.2%。
    • 在 StrategyQA 數據集上,PS+ 達到 65.4% 的準確率,高於零樣本 CoT 的 63.8%。
    • PS+ 的表現雖不及少樣本 CoT(手動),但持續優於零樣本 CoT。
  3. 研究意義:

    • 證實了 PS+ 策略在零樣本設置下處理常識推理問題的有效性。
    • 為無需額外訓練數據的常識推理方法提供了新的可能性。
  4. 局限性:

    • PS+ 雖優於零樣本 CoT,但未達到少樣本 CoT(手動)的水平。
    • 研究未提供少樣本 CoT(手動)的具體數據,限制了更深入的比較。

總體而言,這項研究展示了 PS+ 提示策略在常識推理任務中的潛力,特別是在零樣本學習情境下。然而,要達到手動設計的少樣本方法的效果,仍有進一步提升的空間。

上原始論文 Table3

CommonsenseQA(ACL’19;https://arxiv.org/abs/1811.00937)主要針對常識推理的多選題資料集。StrategyQA(TACL’21;https://arxiv.org/abs/2101.02235)一個需要隱含推理步驟來回答是非問題的資料集

3. 實務應用:運用 LangChain 實現 Plan-and-Solve

Planning 模式作為 Agentic Design Pattern 的組成部分,正在重塑 AI 處理複雜任務的方式。本文將深入探討 Planning 模式的實際應用,特別聚焦於 LangChain 這個強大的框架,展示如何將理論付諸實踐。

3.1 系統架構概述

在閱讀玩經典論文 Plan-and-Solve 文章後,可得到一個簡單的架構來表達 Planning Agent,主要由兩個組件合作:

  1. Planner(規劃者):提示語言模型需要針對任務進行多計劃步驟。
  2. Executors(執行者s):接受使用者查詢和計劃中的步驟並呼叫 1 個或多個工具來完成該任務。

一旦執行完成,代理會再次被調用,並發出重新規劃提示,讓它決定是否完成回應或是否產生後續計劃(如果第一個計劃沒有達到預期效果)。

這種代理設計讓我們不必呼叫大型規劃器LLM對於每個工具調用。它仍然受到串行工具呼叫的限制並使用LLM對於每個任務,因為它不支援變數分配。

3.2 架構的優勢

  1. 關注點分離:規劃與執行分離,提高可靠性
  2. 模組化設計:便於未來替換或優化各個組件
  3. 性能潛力:為使用更小、更快、更經濟的模型鋪平道路

注意:當前實現可能需要較多 API 調用,但這是為了長遠效益的權衡。

3.3 實作案例解析

以下內容採用 LangChain 實作,記得文章中最重要的兩塊嗎?Planner, Executors ,這邊在 Langchain 採用 agent_tool 來達成,如何拆解任務、決斷要不要往下執行主要仰賴語言模型能力決定,工具則交給 Executors 。為此我們來往下看。

3.3.1 設置工具

在計劃與執行代理系統中,工具扮演著至關重要的角色。它們就像是代理的"手"和"眼睛",使其能夠與外界互動並執行各種任務。

search = DuckDuckGoSearchAPIWrapper()
llm = OpenAI(temperature=0)
llm_math_chain = LLMMathChain.from_llm(llm=llm, verbose=True)
tools = [
    Tool(
        name="Search",
        func=search.run,
        description="useful for when you need to answer questions about current events",
    ),
    Tool(
        name="Calculator",
        func=llm_math_chain.run,
        description="useful for when you need to answer questions about math",
    ),
]

設置 Agent 可以使用的工具,包括搜索引擎和計算機:搜索工具使用 DuckDuckGo 搜索 API,允許代理查找最新的信息和事實。計算工具利用 LLMMathChain,這是一個結合了語言模型和數學運算能力的工具。

提示:根據任務的具體需求,您可以添加更多專門的工具,如自然語言處理、圖像識別、或特定領域的API等。工具的多樣性直接影響代理的能力範圍。

3.3.2 制定 PLanner, Executor, Agent

完成工具配置後,下一步是設置計劃者(Planner)、執行者(Executor)和最終的代理(Agent)。這三個組件共同構成了計劃與執行代理系統的核心架構

model = ChatOpenAI(temperature=0)
planner = load_chat_planner(model)
executor = load_agent_executor(model, tools, verbose=True)
agent = PlanAndExecute(planner=planner, executor=executor)

計劃者(Planner)

計劃者負責制定解決問題的整體策略。它使用 ChatOpenAI 模型,這是一個強大的語言模型,能夠理解複雜的指令並生成詳細的計劃。計劃者的主要任務是將大型任務分解為可管理的子任務。

執行者(Executor)

執行者負責實施計劃者制定的策略。它被賦予了使用各種工具的能力,可以執行搜索、計算等具體操作。執行者的 verbose=True 設置允許我們看到執行過程中的詳細信息,這對於調試和理解代理的決策過程非常有用。

代理(Agent)

代理是計劃者和執行者的組合體,代表了整個系統的智能核心。它協調計劃的制定和執行,確保整個過程的順利進行。

提示:調整模型的 temperature 參數可以影響代理的創造性和確定性。較低的值(如本例中的 0)會使輸出更加一致和確定,而較高的值會增加創造性但可能降低準確性。

3.3.4 最後執行結果

讓我們來看看代理如何處理一個關於飲料價格的多步驟查詢:

agent.run(
    "高雄的五十嵐飲料店一杯珍奶多少錢?如果要五杯總共多少?最後回應記得用繁體中文"
)

上五十嵐結果圖

這個任務要求代理完成兩個子任務:

  1. 找看看高雄五十嵐手搖飲料店的珍珠奶茶價格
  2. 計算珍珠奶茶五杯時的售價

Agent 綜合了搜索結果和計算,給出了以下回答:

『單杯珍珠奶茶的價格在五十嵐飲料店約為 TWD40 - 60(約 USD1.3 - 1.95)每杯。五杯珍珠奶茶的總價格為 TWD200(約 USD6.5)。』

4 進階實作:利用 LangGraph 框架打造 Plan-and-Solve 代理

本文將介紹如何創建一個"Plan-and-Solve"風格的智能代理。這種方法受到 Plan-and-Solve 論文和 Baby-AGI 項目的啟發。其核心理念是先制定多步驟計劃,然後逐項執行。完成每個任務後,代理可以重新評估計劃並進行必要的調整。

[圖片:Plan-and-Solve流程圖]

與傳統的 ReAct 風格代理相比,"Plan-and-Solve"方法具有以下優勢:

  1. 明確的長期規劃能力(即使是強大的語言模型也可能在這方面存在不足)
  2. 能夠在執行階段使用較小/較弱的模型,只在規劃階段使用較大/較好的模型

接下來,我們將使用 LangGraph 來實現這一智能代理。最終,代理將生成類似於 這個示例 的執行軌跡。

4.1 整體結構設計

這個工作流程圖定義了代理的整體行為:從規劃開始,然後執行任務,之後重新評估並決定是繼續執行還是結束。

上LangGraph 結構圖

4.2 狀態管理策略

為了有效地管理代理的執行過程,我們需要定義一個清晰的狀態結構。這個結構將包含以下關鍵信息:

  1. input: 代表計劃中的一個步驟。
  2. plan: 用來存儲當前的計劃。
  3. past_steps: 用來追踹已執行的步驟。
  4. response: 用來存儲最終的回應。
class PlanExecute(TypedDict):
    input: str  # 原始輸入
    plan: List[str]  # 當前計劃
    past_steps: Annotated[List[Tuple], operator.add]  # 已執行的步驟
    response: str  # 最終響應

4.3 關鍵節點功能開發

先來建置 Planner,規劃是整個過程的核心。它負責生成初始計劃。我們將使用 OpenAI 的語言模型來生成這個計劃。

class Plan(BaseModel):
    """Plan to follow in future"""

    steps: List[str] = Field(
        description="different steps to follow, should be in sorted order"
    )

再來建置 Executor,根據當前的執行狀態來決定是繼續執行還是提供最終回應。

class Act(BaseModel):
    """Action to perform."""

    action: Union[Response, Plan] = Field(
        description="Action to perform. If you want to respond to user, use Response. "
        "If you need to further use tools to get the answer, use Plan."
    )

添加判斷是否持續執行還是回應的條件邊

def should_end(state: PlanExecute) -> Literal["agent", "__end__"]:
    if "response" in state and state["response"]:
        return "__end__"
    else:
        return "agent"

提示:實作上沒有一對一跟框架相同,實務上還是有些限制要處理,更全面了解的話,請務必跑過一次程式碼。程式碼

4.4 成果展示與分析

最後,讓我們運行一個範例來測試我們的"Plan-and-Execute" Agent:

執行結果圖

溫腥提示:我無法確定當前的你需要執行幾次才可以達到想要的答案,該方法很大一塊邏輯是在 Planner 身上。

5. 結語與未來展望

本文深入探討了 Agentic Design Pattern 中的 Planning 模式,特別聚焦於 Plan-and-Solve 方法的理論基礎和實際應用。我們可以得出以下幾點結論:

  1. Planning 模式為 AI 代理提供了自主規劃的能力,使其能夠處理複雜且難以預定義的任務。

  2. Plan-and-Solve 方法通過將任務分解為可管理的子任務,並在執行過程中進行動態調整,大大提高了 AI 系統的效能和靈活性。

  3. LangChain 和 LangGraph 等框架為實現 Planning 模式提供了強大的工具,使得開發者能夠更容易地構建具有規劃能力的 AI 系統。

  4. 實驗結果表明,採用 Planning 模式的系統在處理複雜任務時,相比傳統方法具有明顯優勢。

總的來說,Planning 模式代表了 AI 系統向更高層次智能邁進的重要一步。隨著技術的不斷進步,我們有理由相信,具有自主規劃能力的 AI 系統將在未來發揮越來越重要的作用,為人類解決更加複雜和多樣化的問題。

即刻前往教學程式碼 Repo,親自動手體驗 AI 代理規劃的力量吧!別忘了給專案按個星星並持續關注更新,讓我們一起探索AI代理的新境界。

x.參考資料

  1. https://www.deeplearning.ai/the-batch/agentic-design-patterns-part-4-planning/
  2. https://arxiv.org/abs/2303.17580
  3. ACL’23 https://github.com/AGI-Edgerunners/Plan-and-Solve-Prompting
  4. https://llmnanban.akmmusai.pro/Mastery/Plan-and-Solve-Prompting-explained/
  5. https://blog.langchain.dev/planning-agents/
  6. https://github.com/langchain-ai/langchain/blob/master/cookbook/plan_and_execute_agent.ipynb
  7. https://www.pelayoarbues.com/literature-notes/Articles/Plan-and-Execute-Agents

上一篇
【Day 14】- 翻譯革新:從吳恩達的 Translation Agent 到 LangGraph 的智能協作模式
下一篇
【Day 16】- Agentic Pattern:以多代理協作模式革新 AI 系統
系列文
2024 年用 LangGraph 從零開始實現 Agentic AI System31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言